package com.yanggu.scala.chapater07.myabstract

object AbstractDemo01 {

  def main(args: Array[String]): Unit = {
    println("XXXXXXXXXXXX")

    //如果想要new一个抽象类必须要实例化抽象字段和抽象方法
    val animal: Animal = new Animal {
      override val name: String = ""
      override var age: Int = _

      override def eat(): Unit = {}
    }
  }

}

//scala中可以使用abstract关键字用来标识不能实例化的类
//抽象类中的可以有抽象字段、实例字段、抽象方法以及普通方法
//抽象字段就是没有初始化的字段
//抽象方法就是没有方法体的方法
//抽象类中可以没有抽象方法, 这点和java类似
abstract class Animal {

//  抽象字段，只会生成抽象的name()方法
  val name : String

//  抽象字段，会生成抽象的age()和age_$eq()方法
  var age : Int

//  非抽象字段，普通属性，生成color()和color_$eq()方法
  var color : String = "黄色"

//  非抽象字段，不可变属性，生成sex()方法
  val sex : String = "公"

//  抽象方法不需要生命abstract，只需要省略方法体即可
  def eat(): Unit

  //普通方法, 有方法体
  def eat2(): Unit = {
    println("eat2普通方法被调用了。。。。")
  }

}
